home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / bbs / Hydra11s.lha / HBBS / Source / Oberon / MenuPrompt.mod < prev    next >
Text File  |  1996-07-05  |  8KB  |  347 lines

  1. MODULE MenuPrompt;
  2.  
  3.     IMPORT
  4.     a:= Arguments, ac:= ANSIConsole, st:= Strings, cv:= Conversions, io, s:= SYSTEM,
  5.     e:= Exec, d:= Dos, ol:= OberonLib,
  6.     bo:= BBSColours, bs:= BBSStructures, bc:= BBSConstants,
  7.     hn:= HBBSNode, hc:= HBBSCommon, req:= Requests;
  8.  
  9.  
  10.     CONST EOF = -1; LF = 0AH;
  11.       LineLength = 80;
  12.       LTRUE = 1; LFALSE = 0;
  13.  
  14.     TYPE
  15.     LineNodePtr = UNTRACED POINTER TO LineNode;
  16.     LineNode = STRUCT
  17.         prev, next: LineNodePtr;
  18.         text: ARRAY LineLength OF CHAR;
  19.     END;
  20.  
  21.     VAR
  22.     BBSGlobal: bs.BBSGlobalDataPtr;
  23.     NnD: bs.NodeDataPtr;
  24.     NodeNum: LONGINT;
  25.     sLine: ARRAY 80 OF CHAR;
  26.     sQuitCmd: ARRAY 80 OF CHAR;
  27.     useQuitCmd: BOOLEAN;
  28.     argList: LineNodePtr;
  29.     CountArgs: INTEGER;
  30.     file: d.FileHandlePtr;
  31.     textPool: e.MemPoolPtr;
  32.     menuName: LineNodePtr;
  33.  
  34.     PROCEDURE cleanup(num: LONGINT);
  35.     BEGIN
  36.     IF hn.HBBSNodeBase # NIL THEN
  37.         hn.HBBSCleanUpDoor;
  38.         e.CloseLibrary(hn.HBBSNodeBase);
  39.         hn.HBBSNodeBase:= NIL;
  40.     END;
  41.     IF hc.HBBSCommonBase # NIL THEN
  42.         hc.HBBSCleanUpCommon;
  43.         e.CloseLibrary(hc.HBBSCommonBase);
  44.         hc.HBBSCommonBase:= NIL;
  45.     END;
  46.  
  47.     IF num # 0 THEN
  48.         io.WriteString("Door Error = ");
  49.         io.WriteInt(num, 0); io.WriteLn;
  50.          (* io.Format("Door Error = %d\n", s.ADR(num)) *)
  51.     END;
  52.     END cleanup;
  53.  
  54.     PROCEDURE init(name: e.STRPTR);
  55.     BEGIN
  56.     
  57.     IF hc.HBBSCommonBase = NIL THEN
  58.         cleanup(1); RETURN
  59.     END;
  60.     IF NOT hc.HBBSInitCommon() THEN
  61.         cleanup(2); RETURN
  62.     END;
  63.  
  64.     IF hn.HBBSNodeBase = NIL THEN
  65.         cleanup(3); RETURN
  66.     END;
  67.  
  68.     IF NOT hn.HBBSInitDoor(SHORT(NodeNum), name) THEN
  69.         cleanup(4); RETURN
  70.     END;
  71.  
  72.     END init;
  73.  
  74.     PROCEDURE AddNode(VAR list: LineNodePtr; at: INTEGER): LineNodePtr;
  75.     VAR last, new: LineNodePtr;
  76.         dummy: LineNode;
  77.     BEGIN
  78.     new:= e.AllocPooled(textPool, s.SIZE(dummy));
  79.     IF list = NIL THEN
  80.         IF new # NIL THEN
  81.         new^.prev:= NIL;
  82.         new^.next:= NIL;
  83.         END;
  84.         list:= new;
  85.     ELSE
  86.         IF at <= 1 THEN
  87.         IF new # NIL THEN
  88.             new^.prev:= NIL;
  89.             new^.next:= list;
  90.             list^.prev:= new;
  91.             list:= new;
  92.         END;
  93.         ELSE
  94.         last:= list;
  95.         WHILE (last^.next # NIL) & (at > 2) DO
  96.             last:= last^.next; at:= at - 1
  97.         END;
  98.         IF new # NIL THEN
  99.             new^.next:= last^.next;
  100.             new^.prev:= last;
  101.             IF last^.next # NIL THEN
  102.             last^.next^.prev:= new
  103.             END;
  104.             last^.next:= new;
  105.         END;
  106.         END;
  107.     END;
  108.     RETURN new;
  109.     END AddNode;
  110.  
  111.     PROCEDURE DeleteNode(VAR list: LineNodePtr; at: INTEGER);
  112.     VAR this: LineNodePtr;
  113.         dummy: LineNode;
  114.     BEGIN
  115.     IF list # NIL THEN
  116.         this:= list;
  117.         IF at <= 1 THEN
  118.         list:= this^.next;
  119.         IF list # NIL THEN list^.prev:= NIL END;
  120.         ELSE
  121.         WHILE (this^.next # NIL) & (at > 1) DO
  122.             this:= this^.next; at:= at - 1
  123.         END;
  124.         IF this^.prev # NIL THEN
  125.             this^.prev^.next:= this^.next
  126.         END;
  127.         IF this^.next # NIL THEN
  128.             this^.next^.prev:= this^.prev;
  129.         END;
  130.         END;
  131.         e.FreePooled(textPool, this, s.SIZE(dummy));
  132.     END;
  133.     END DeleteNode;
  134.  
  135.     PROCEDURE GetNode(list: LineNodePtr; at: INTEGER): LineNodePtr;
  136.     BEGIN
  137.     IF list = NIL THEN RETURN NIL END;
  138.     WHILE (list # NIL) & (at > 1) DO
  139.         list:= list^.next; at:= at - 1;
  140.     END;
  141.     RETURN list;
  142.     END GetNode;
  143.  
  144.     PROCEDURE ReqNumber(l: LONGINT);
  145.     VAR str: ARRAY 80 OF CHAR;
  146.         ok: BOOLEAN;
  147.         count: INTEGER; factor: LONGINT;
  148.     BEGIN
  149.     factor:= 1000000000; count:= 10;
  150.     WHILE (ABS(l) < factor) & (count > 1) DO count:= count - 1; factor:= factor DIV 10 END;
  151.     ok:= cv.IntToString(l, str, count);
  152.     IF ok THEN
  153.         req.BreakPoint(str)
  154.     END;
  155.     END ReqNumber;
  156.  
  157.     VAR str: ARRAY 80 OF CHAR;
  158.  
  159.     PROCEDURE PutNumber(l: LONGINT);
  160.     VAR ok: BOOLEAN;
  161.         count: INTEGER; factor: LONGINT;
  162.     BEGIN
  163.     factor:= 1000000000; count:= 10;
  164.     WHILE (ABS(l) < factor) & (count > 1) DO count:= count - 1; factor:= factor DIV 10 END;
  165.     ok:= cv.IntToString(l, str, count);
  166.     IF ok THEN
  167.         hn.DOORWriteText(s.ADR(str));
  168.     END;
  169.     END PutNumber;
  170.  
  171.     VAR str1: ARRAY 2 OF CHAR;
  172.  
  173.     PROCEDURE PutChar(ch: CHAR);
  174.     BEGIN
  175.     str1[0]:= ch; str1[1]:= CHR(0);
  176.     hn.DOORWriteText(s.ADR(str1));
  177.     END PutChar;
  178.  
  179.     PROCEDURE ReplyArgs;
  180.     VAR
  181.         i: INTEGER;
  182.         thisArg: LineNodePtr;
  183.     BEGIN
  184.     i:= 1;
  185.     LOOP
  186.         thisArg:= GetNode(argList, i);
  187.         IF thisArg # NIL THEN hn.DOORWriteText(s.ADR(thisArg^.text)) END; 
  188.         hn.DOORWriteText(s.ADR(" "));
  189.         IF thisArg = NIL THEN EXIT END;
  190.         i:= i + 1
  191.     END;
  192.     END ReplyArgs;
  193.  
  194.     PROCEDURE DoorMain;
  195.  
  196.     CONST MaxCharsTag ="MAXCHARS="; QuitCommandTag = "QUITCMD=";
  197.  
  198.     VAR
  199.         NoDisplayMenu, NoPausePrompt, menuDisplayed: BOOLEAN;
  200.         error, result, maxChars, pos, len, flags: LONGINT;
  201.         prompt, command, doorname, option: ARRAY 80 OF CHAR;
  202.     BEGIN
  203.     (* ReplyArgs; *)
  204.     NoDisplayMenu:= st.Occurs(NnD^.ActiveDoor^.SystemOptions^, "NOMENU") >= 0;
  205.     NoPausePrompt:= st.Occurs(NnD^.ActiveDoor^.SystemOptions^, "NOPAUSE") >= 0;
  206.  
  207.     pos:= st.Occurs(NnD^.ActiveDoor^.SystemOptions^, MaxCharsTag);
  208.     IF pos >= 0 THEN
  209.         st.Cut(NnD^.ActiveDoor^.SystemOptions^, pos + SIZE(MaxCharsTag), 80, option);
  210.         len:= st.Occurs(option, " ");
  211.         IF len >= 0 THEN
  212.         st.Cut(option, 0, len, option);
  213.         END;
  214.         IF NOT cv.StringToInt(option, maxChars) THEN
  215.         maxChars:= 0
  216.         END;
  217.     ELSE
  218.         maxChars:= 0
  219.     END;
  220.  
  221.     pos:= st.Occurs(NnD^.ActiveDoor^.SystemOptions^, QuitCommandTag);
  222.     useQuitCmd:= pos >= 0;
  223.     IF pos >= 0 THEN
  224.         st.Cut(NnD^.ActiveDoor^.SystemOptions^, pos + SIZE(QuitCommandTag), 80, sQuitCmd);
  225.         len:= st.Occurs(sQuitCmd, " ");
  226.         IF len >= 0 THEN
  227.         st.Cut(sQuitCmd, 0, len, sQuitCmd);
  228.         END;
  229.         st.Upper(sQuitCmd);
  230.     END;
  231.  
  232.     flags:= bc.GlEdit + bc.GlHistory + bc.GlDisplay;
  233.     IF maxChars > 0 THEN flags:= flags + bc.GlImmediate END;
  234.  
  235.     REPEAT
  236.         error:= 0;
  237.         IF (NnD^.User.CallData.UserType = bc.UserTypeNormal) & (NOT NoDisplayMenu) & (NOT menuDisplayed) THEN
  238.         IF NOT NoPausePrompt THEN
  239.             IF hn.DOORPausePrompt(NIL) # 0 THEN error:= 1 END;
  240.         END;
  241.         IF hn.DOORDisplaySpecialScreen(s.ADR("MENU")) # bc.LTRUE THEN END;
  242.         END;
  243.         menuDisplayed:= FALSE;
  244.  
  245.         IF bc.nFlagOLMWaiting IN NnD^.NodeFlags THEN
  246.         IF hn.DOORSystemDoor(s.ADR("ReadOLM"), NIL) # 0 THEN error:= 3 END;
  247.         END;
  248.  
  249.         IF NnD^.CurrentConf # NIL THEN
  250.         hc.strNcpy(s.ADR(prompt), NnD^.CurrentConf^.MenuPrompt, 79);
  251.         hc.strNcpy(s.ADR(prompt), hn.HBBSModifyString(s.ADR(prompt)), 79);
  252.         ELSE
  253.         prompt:= ">"
  254.         END;
  255.  
  256.         hn.DOORWriteText(s.ADR(prompt)); hn.DOORWriteText(s.ADR(" "));
  257.  
  258.         result:= hn.DOORGetLine(flags, CHR(0), maxChars, 0, NIL);
  259.         hc.strNcpy(s.ADR(command), NnD^.CurrentLine, 79);
  260.         hc.RemoveSpaces(s.ADR(command));
  261.  
  262.         IF st.Length(command) > 0 THEN
  263.         pos:= hc.iPosition(s.ADR(" "), s.ADR(command));
  264.         IF pos < 0 THEN pos:= st.Length(command) END;
  265.         hc.strNcpy(s.ADR(doorname), s.ADR(command), SHORT(pos));
  266.         hc.StrFCpy(s.ADR(option), s.ADR(command), SHORT(pos + 1));
  267.  
  268.         IF st.Occurs(doorname, "?") >= 0 THEN
  269.             IF hn.DOORDisplaySpecialScreen(s.ADR("MENU")) # bc.LTRUE THEN END;
  270.             menuDisplayed:= TRUE;
  271.         ELSE
  272.             IF hn.DOORUserDoor(s.ADR(doorname), s.ADR(option)) # bc.LTRUE THEN END;
  273.         END;
  274.         ELSE
  275.         ac.UP(PutChar, 1);
  276.         menuDisplayed:= TRUE;
  277.         END;
  278.  
  279.         IF (hn.CarrierLost()= e.LTRUE) & (NnD^.LoginType = bc.LoginRemote) THEN
  280.         NnD^.OnlineStatus:= bc.OSOffline
  281.         END;
  282.         IF error # 0 THEN
  283.         hn.DOORWriteText(s.ADR("Menu error #")); PutNumber(error);
  284.         hn.DOORWriteText(s.ADR("\n"));
  285.         error:= 0
  286.         END;
  287.  
  288.         st.Upper(doorname);
  289.  
  290.     UNTIL (NnD^.OnlineStatus # bc.OSOnline) OR ((st.Occurs(sQuitCmd, doorname) = 0) & useQuitCmd);
  291.  
  292.     END DoorMain;
  293.  
  294.     PROCEDURE ParseArgs;
  295.     VAR
  296.         i: INTEGER;
  297.         newArg: LineNodePtr;
  298.         s: ARRAY 80 OF CHAR;
  299.         ok: BOOLEAN;
  300.     BEGIN
  301.     CountArgs:= a.NumArgs();
  302.     i:= 1;
  303.     WHILE i <= CountArgs DO
  304.         newArg:= AddNode(argList, MAX(INTEGER));
  305.         IF newArg # NIL THEN
  306.         a.GetArg(i, newArg^.text);
  307.         ELSE
  308.         CountArgs:= i;
  309.         END;
  310.         i:= i + 1
  311.     END;
  312.     END ParseArgs;
  313.  
  314.  
  315.     VAR
  316.     newArg: LineNodePtr;
  317.     dummy: LineNode;
  318.  
  319. BEGIN
  320.     textPool:= e.CreatePool(LONGSET{}, s.SIZE(dummy), s.SIZE(dummy));
  321.     ParseArgs;
  322.     IF CountArgs > 0 THEN
  323.      newArg:= GetNode(argList, 1);
  324.      IF cv.StringToInt(newArg^.text, NodeNum) THEN
  325.         init(s.ADR("MenuPrompt"));
  326.         IF hc.HBBSCommonBase # NIL THEN
  327.         BBSGlobal:= hc.HBBSGimmeBBS();
  328.         IF BBSGlobal # NIL THEN
  329.             NnD:= hc.HBBSNodeDataPtr(SHORT(NodeNum));
  330.             IF NnD # NIL THEN
  331.             DoorMain;
  332.             END;
  333.         END;
  334.         END;
  335.         cleanup(0);
  336.     ELSE
  337.         io.WriteString("Invalid Param for door!\n")
  338.     END;
  339.     ELSE
  340.     io.WriteString("No Param for door!\n");
  341.     END;
  342. CLOSE
  343.     cleanup(0);
  344.     e.DeletePool(textPool);
  345. END MenuPrompt.
  346.  
  347.